package com.chenjun.common.util;

import java.util.Random;

import org.apache.commons.lang3.StringUtils;

/**
 * 生成业务编码工具类
 * 
 * @Title BusinessNoUtil
 * @author 李伟
 * @date 2015年6月24日 下午1:27:35
 */
public final class BusinessNoUtil {

	public static final String CONTRACT_PREFIX = "C";

	public static final String ADJUST_PREFIX = "A";// 调整合同前缀

	public static final String OVERDUE_PREFIX = "O";// 逾期合同前缀

	public static final String RECEIPT_PREFIX = "R";// 收款编号

	public static final String MEMBER_PREFIX = "M";// 会员编号

	private BusinessNoUtil() {
	}

	/**
	 * 获取合同编号
	 * 
	 * @return String
	 */
	public static String getContractNo() {
		return CONTRACT_PREFIX + generateNumber();
	}

	/**
	 * 获取调整编号
	 * 
	 * @return String
	 */
	public static String getAdjustNo() {
		return ADJUST_PREFIX + generateNumber();
	}

	/**
	 * 获取逾期编号
	 * 
	 * @return String
	 */
	public static String getOverdueNo() {
		return OVERDUE_PREFIX + generateNumber();
	}

	/**
	 * 获取收款编号
	 * 
	 * @return String
	 */
	public static String getReceiptNo() {
		return RECEIPT_PREFIX + generateNumber();
	}

	/**
	 * 
	 * 获取当前的编号
	 * 
	 * @param currentNo
	 * @param nextNo
	 * @return String
	 */
	public static String getCurrentNo(String currentNo, String nextNo) {

		if (StringUtils.isBlank(currentNo)) {
			throw new NullPointerException("currentNo cannot be null");
		}

		if (StringUtils.isBlank(nextNo)) {
			throw new NullPointerException("nextNo cannot be null");
		}

		if (StringUtils.isNoneBlank(currentNo)) {
			return currentNo.substring(0, currentNo.length() - nextNo.length())
					+ nextNo;
		}
		return "";
	}

	/**
	 * 
	 * 自动生成优惠券号
	 * 
	 * @return String
	 */
	public static String generatedCouponNo() {
		String cn = String.valueOf(System.currentTimeMillis());
		return cn.substring(0, 10);
	}

	/**
	 * 获取随机生成的六位密码
	 * 
	 * @return String
	 */
/*	public static String getRandomPasswd() {

		Random r = new Random();
		String code = "";

		for (int i = 0; i < 6; ++i) {
			if (i % 2 == 0) // 偶数位生产随机整数
			{
				code = code + r.nextInt(10);
			} else// 奇数产生随机字母包括大小写
			{
				int temp = r.nextInt(52);
				char x = (char) (temp < 26 ? temp + 97 : (temp % 26) + 65);
				code += x;
			}
		}

		return code;
	}*/

	/**
	 * 随机生成输入长度的字符串，生成策略：前序列位[A-Z]-[0-9]-[a-z]{length/3},后余位随机
	 * 
	 * @param length
	 *            所要生成的字符串长度
	 * @return String 生成的随机字符串
	 */
	public static String getRandomPasswd() {
		char[] ss = new char[6];// 存放生成的字符串
		int i = 0;
		int index = 0;// 索引位置
		int standard = 6 / 3;// 前几位必须包含大小写字母数字
		// 标准随机策略，可做相应更改
		while (i < standard) {
			ss[index] = (char) ('A' + Math.random() * 26);// 随机一个大写字母
			ss[index + 1] = (char) ('0' + Math.random() * 10); // 随机一个数字
			ss[index + 2] = (char) ('a' + Math.random() * 26); // 随机一个小写字母
			i++;
			index = index + 3;
		}
		// 后续位数随机生成
		while (index < 6) {
			int f = (int) (Math.random() * 6);// 生成随机长度数
			if (f > index - 1)
				ss[index] = (char) ('A' + Math.random() * 26);
			else if (f > index - 3)
				ss[index] = (char) ('a' + Math.random() * 26);
			else
				ss[index] = (char) ('0' + Math.random() * 10);
			index++;
		}
		return new String(ss);
	}

	/**
	 * 这是典型的随机洗牌算法。 流程是从备选数组中选择一个放入目标数组中，将选取的数组从备选数组移除（放至最后，并缩小选择区域） 算法时间复杂度O(n)
	 * 
	 * @return 随机8为不重复数组
	 */
	public static String generateNumber() {
		String no = "";
		// 初始化备选数组
		int[] defaultNums = new int[10];
		for (int i = 0; i < defaultNums.length; i++) {
			defaultNums[i] = i;
		}

		Random random = new Random();
		int[] nums = new int[LENGTH];
		// 默认数组中可以选择的部分长度
		int canBeUsed = 10;
		// 填充目标数组
		for (int i = 0; i < nums.length; i++) {
			// 将随机选取的数字存入目标数组
			int index = random.nextInt(canBeUsed);
			nums[i] = defaultNums[index];
			// 将已用过的数字扔到备选数组最后，并减小可选区域
			swap(index, canBeUsed - 1, defaultNums);
			canBeUsed--;
		}
		if (nums.length > 0) {
			for (int i = 0; i < nums.length; i++) {
				no += nums[i];
			}
		}

		return no;
	}

	private static final int LENGTH = 8;

	private static void swap(int i, int j, int[] nums) {
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] = temp;
	}

	public static String generateNumber2() {
		String no = "";
		int num[] = new int[8];
		int c = 0;
		for (int i = 0; i < 8; i++) {
			num[i] = new Random().nextInt(10);
			c = num[i];
			for (int j = 0; j < i; j++) {
				if (num[j] == c) {
					i--;
					break;
				}
			}
		}
		if (num.length > 0) {
			for (int i = 0; i < num.length; i++) {
				no += num[i];
			}
		}
		return no;
	}

	/**
	 * @author zhangzhanwen
	 */
	public static String getFaceGroup() {
		Long seed = System.currentTimeMillis();
		Random rd = new Random(seed);
		String passWrd = "";
		int getNum;
		do {
			getNum = Math.abs(rd.nextInt()) % 10 + 48;
			char num1 = (char) getNum;
			passWrd += Character.toString(num1);

		} while (passWrd.length() < 6);

		return passWrd;
	}

	public static void main(String[] args) {
		System.out.println(getRandomPasswd());
	}
}
